package com.itheima.leetcode.od.b.logicalsimulation;

/**
 * <h3>完全数计算</h3>
 * <h4>约数相加等于其本身</h4>
 * 完全数，又称完美数或完备数，是一些特殊的自然数。它所有的真因子（即除了自身以外的约数）之和恰好等于它本身。
 * <p>
 * 现在，你需要计算 1 到 n之间完全数的个数。
 * <p>
 * 输入描述：
 * <p>
 * 输入一个整数 n(1≦n≦5×10^5)
 * <p>
 * 输出描述：
 * <p>
 * 输出一个整数，代表区间内完全数的个数。
 * <p>
 * 示例1
 * <p>
 * 输入：
 * <p>
 * 1000
 * <p>
 * 输出：
 * <p>
 * 3
 * <p>
 * 说明：
 * <p>
 * 第一个完全数是 6，因为 6 的约数有 1,2,3,6，去除本身后，剩余约数之和为 1+2+3=6。
 * <p>
 * 第二个完全数是 28，因为 28 的约数有 1,2,4,7,14,28，去除本身后，剩余约数之和为 1+2+4+7+14=28
 * <p>
 * 第二个完全数是 496。
 */
public class CompleteNumberCalculation {
    public static void main(String[] args) {
        /*// 创建Scanner对象用于读取输入
        Scanner sc = new Scanner(System.in);
        // 读取输入的上限数字
        int nextInt = sc.nextInt();*/

        int nextInt = 1000;

        System.out.println(getResult(nextInt));
    }

    public static int getResult(int nextInt) {
        // 计数器，用于统计完全数的个数
        int count = 0;
        // 遍历从1到输入数字的所有数
        for (int i = 1; i <= nextInt; i++) {
            // 判断当前数字是否为完全数
            if (isPerfectNumber(i)) {
                // 完全数计数加1
                count++;
            }
        }
        // 输出找到的完全数的总个数
        return count;
    }

    /**
     * 判断一个数是否为完全数
     *
     * @param number 待判断的数字
     * @return 如果是完全数返回true，否则返回false
     */
    public static boolean isPerfectNumber(int number) {
        // 用于存储所有因子之和
        int num = 0;
        // 只需要遍历到number/2即可，因为一个数的最大因子（除了自身）不会超过它的一半
        for (int i = 1; i <= number / 2; i++) {
            // 如果i是number的因子
            if (number % i == 0) {
                // 将这个因子加到总和中
                num = num + i;
            }
        }
        // 判断因子之和是否等于原数
        return num == number;
    }
}